perm filename COMPLR.STR[LSP,JRA] blob sn#100800 filedate 1974-05-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		Source language
C00003 00003			Interpteter for source language
C00005 00004	Notes:
C00006 00005	Theorem
C00007 00006	Try it:
C00010 ENDMK
C⊗;
	Source language
Concrete
exp	::= var | const | sum

sum	::= exp + exp

Abstract
exp	::= var | const | sum

sum	::= struct[ arg1:exp; arg2:exp]


	Object language
Concrete
prog	::= inst prog
	::= ε

inst	::= li | lo | st | ad

li	::= <LI int>

lo	::= <LO adr>

st	::= <ST adr>

ad	::= <AD adr>

adr	::= id

Abstract
prog	::= seq[inst]

inst	::= li 
	::= lo 
	::= st 
	::= ad

li	::= struct[cnst:arg]

lo	::= struct[loc:adr]

		Interpteter for source language

value_s[e:exp;a:environ_s]int
 generic(e)
	[var]      => find(e,a)
	[const]    => denote(e)
	[sum(u,v)] => +(value_s(u,a),value_s(v,a))
 end;



		Interpreter for object language

value_o[p:prog;st:environ_o]environ_o
 on(p)
	[ε]      => st
	[(i⊗p1)] => value_o(p1,step(i,st))
 end;

step[i:inst; st:environ_o] environ_o
 generic(i)
	[li(c)]   => new_env_o(AC,c,st)
	[lo(adr)] => new_env_o(AC,cont(adr),st)
	[st(adr)] => new_env_o(adr,cont(AC),st)
	[ad(adr)] => new_env_o(AC,cont(AC)cont(adr),st)
end;



		Compiler

compile[e:exp;tbl:environ_o]prog
 generic(e)
	[var]      => lo(loc(e,tbl)) 
	[const]    => li(denote e) 
	[sum(u,v)] =>  prog(compile(u,tbl),
			    st(last(nev(tbl)),
			    compile(v,nev(tbl)),
			    ad(last(nev(tbl))))
end;
Notes:
	3.1-3.7 of McCarthy Painter are consequences of  data structures.
	3.13 is also consequence.

	It seemed artificial to use map and t of Mc Carthy Painter.
	 We will see how proof goes.
Theorem

value_o(compile(e:exp,tbl:environ_o),tbl:environ_o) 

	=
		new_env_o(AC,value_s(e:exp,a:environ_s)tbl:environ_o)



Try it:

value_o(						;tbl:environ_o)
	compile[e:exp;tbl:environ_o]prog
	 generic(e)
		[var]      => lo(loc(e,tbl)) 
		[const]    => li(denote e) 
		[sum(u,v)] =>  prog(compile(u,tbl),
				    st(last(nev(tbl)),
				    compile(v,nev(tbl)),
				    ad(last(nev(tbl))))
	end;


equals

new_env_o(AC,					 ,tbl:environ_o)
	      value_s[e:exp;a:environ_s]int
		generic(e)
	 	  [var]      => find(e,a)
		  [const]    => denote(e)
		  [sum(u,v)] => +(value_s(u,a),value_s(v,a))
		end;


Proof is generic on e;

i. [const]
value_o(prog(li(denote(e)),tbl)
value_o(li(denote(e)),tbl)
value_o(ε,step(denote(e),tbl)
new_env_o(AC,denote(e),tbl)


ii. [var]
value_o(prog(lo(loc(e,tbl))),tbl)

step(lo(loc(e)tbl)
new_env_o(AC,cont(loc(e,tbl)),tbl)

?new_env_o(AC,find(e,a),tbl))?


iii.
[sum(u,v)]
value_o(prog(compile(u,tbl),             ,tbl)
  	     st(last(nev(tbl)),
	     compile(v,nev(tbl)),
	     ad(last(nev(tbl))))

value_o(prog(st(last(nev(tbl),             ,step(compile(u,tbl)))
	     compile(v,nev(tbl)),
	     ad(last(nev(tbl))))

value_o(prog(compile(v,nev(tbl))	 ,step(st(last(nev(tbl),step(compile(u,tbl)))
	     ad(last(nev(tbl))))

value_o(prog(                   ,step(compile(v,nev(tbl)),step(st(last(nev(tbl),step(compile(u,tbl)))
	     ad(last(nev(tbl))))

step(ad(last(nev(tbl)))),
     step(compile(v,nev(tbl)),
          step(st(last(nev(tbl),
               step(compile(u,tbl))))))))

Assume theorem for u and v;
	value_o(compile(e:exp,tbl:environ_o),tbl:environ_o) 
			=
	new_env_o(AC,value_s(e:exp,a:environ_s)tbl:environ_o)